# 正则表达式
# 字符串查找，匹配与替换

''' 正则表达式的基础，匹配字符和数量词、边界匹配
# （1）字符
# .   代表任意字符（除了\n以外)
# \   转义符
      \r 回车（产生一个新的行）
      \n 换行（光标移到下一行）
      \t 制表符（tab）
      \v 制表符（纵向）
      \000 空格
      \\  代表输出\
      \\\\代表输出\\
      .....
# []  字符集，或者理解为对应位置的内容可以为字符集中任意字符
    acd,abc,aec,arc
    a[b|e]c
预定义字符
\d   [0-9]             匹配数字字符
\w   [a-zA-Z0-9_]      匹配单词字符
\s   [空格\r\n\t\f\v]   匹配空白字符
\D   [^0-9]            匹配非数字字符
\W   [^\w]             匹配非单词字符
\S   [^\s]             匹配非空白字符

（2）数量词
+ 代表匹配1次到无限次 {1,}
? 代表匹配0次到1次   {0,1}
* 代表匹配0次到无限次 {0,}
15900792222
1[3|5|7|8]\d{9}

# {n}    代表前面一位字符规则匹配n次
# {m,n}  代表前面一位字符规则匹配m到n次

1234a56789b
\d{4,6}
1234
5678
6789
56789

# {m,}   代表满足前面一位字符规则至少出现m次
1234a56789b1390122
\d{5,}
56789
13901
39012
90122
139012
390122
1390122

（3）边界匹配
^  匹配字符串开头（在多行模式中匹配每一行的开头）
    （假如^出现在字符集[]中,则表示非的意思）
$  匹配字符串结束（在多行模式中匹配每一行的结束）

\A  仅匹配字符串开头（不考虑行数）
\Z  仅匹配字符串结尾（不考虑行数）
'''
import re #引入正则表达式
# 验证输入的字符串是否是手机号
# #1.建立正则表达式pattern对象
# re_com=re.compile('1[3578]\d{9}')
# phone=input('请输入你的手机号：')
# #2.验证是否存在满足要求的结果
# # match 验证正则表达式，如果没有得到结果，返回None
# print(re.match(re_com,phone))
# #print(re_com.match(phone))
# # 查看匹配到的结果
# #print(re.match(re_com,phone).group())
# #3.搜索
# print(re.search(re_com,phone))

# search和match区别
# str='a123b345'
# re_com=re.compile('\d{3}')
# print(re_com.match(str))
# print(re_com.search(str))
# match 默认从字符串首字母开始匹配，如果不满足，则直接返回None
# seach 默认从字符串首字母开始匹配，如果不满足，则向后匹配，直到匹配完仍然没有找到则返回None
# 可以设置起始匹配索引pos，和终止匹配索引endpos

# 3.字符串切割
# str='abc1def2ghi3'
# re_com=re.compile('\d')
# print(re_com.split(str))

# 4.findall
# 搜索字符串，以列表形式返回全部能匹配到的内容
# search 区别，search一旦匹配到就不再向后匹配
# findall 找到所有满足
# str='1234a56789b1390122'
# re_com=re.compile('\d{5,}')
# print(re_com.search(str).group())
# print(re_com.findall(str))

# 5.finditer  类似于findall，只是，返回的是一个迭代器，里面存每一个匹配到的结果

# 6 sub 字符串替换
# abcd@dcba 进行@的左右交换
str='abcd@dcba'
re_com=re.compile('(\w+)@(\w+)')
print(re_com.sub(r'\2@\1',str))
# r模式，r模式中\失去转移符的意义

# 邮箱验证
str="fan_111@163.com"
# 必须仅有一个@且不再第一位
# 有后缀 .com   .cn    .com.cn  .....
re_com=re.compile('^\w+@\w+(\.\w{2,7}){1,2}$')
print(re_com.match(str))
print(re_com.match('1@qq.com.cn.sh'))

# *****
# 正则表达式不能判断数据的真实存在性，只能判断是否满足某种预定义规则